<?php 

//////////     WRAPPER FACEBOOK


class Facebook
{
	
	////////////  CHAMPS
	
	
	private $appId;
	private $appSecret;
	private $postAuthUrl;
	private $codeAPI;
	private $accessToken;
	private $permissionsArray;
	
	
	
	////////  CONSTRUCTEUR
	
        public function __construct($appId, $appSecret, $postAuthUrl, $permissionsArray)
	{
		
		// on recupère les paramètres du constructeur
		$this->appId = $appId;
		$this->appSecret = $appSecret;
		$this->postAuthUrl = $postAuthUrl; 
		$this->permissionsArray = $permissionsArray;
		
		// en instanciant la classe FB, on détecte si le user est déjà authentifié
		
		// on vérifie la présence d'un "code" (valeur arbitraire fournie par FB) dans la session
		// si présente = user authentifié, si pas le user doit s'identifier
		
		$this->codeAPI = $_REQUEST["code"];
		
		if (empty($this->codeAPI)) {
			$this->authentification();
		}
		
		// quand user est déjà authentifié, on récupère son access token
		// qui nous servira pour faire les appels à l'API de Facebook
		$this->accessToken = $this->getAccessToken();
		
	}
	
	
	//////  METHODES
	
	private function authentification() {
		
			// on appelle l'URL de la boîte de dialogue FB qui va demander à user
			// de s'indentifier, donner les permissions de l'appli, etc.
			// Note: on utilise un script avec "location.href" pour rediriger la page
			// (les headers risquent de ne pas marcher si du code HTML a déjà été 
			// introduit).	
		
			// AJOUT: http://developers.facebook.com/docs/authentication/server-side/
			// ajouter attribut dans URL &scope
			// Listes des autorisations: http://developers.facebook.com/docs/authentication/permissions/
		
			$dialogUrl = 'https://www.facebook.com/dialog/oauth?client_id='
					. $this->appId . '&redirect_uri=' . urlencode($this->postAuthUrl)
					. '&scope=' . implode(',', $this->permissionsArray);
			
			echo("<script>top.location.href='" . $dialogUrl . "'</script>");
	}

	public function getItemsInfos($arrayOfObjectId){
		
		// on récupère un tableau avec plusieurs object_id d'items (status, photos, events, etc.)
		// on batche les requetes
		// et on renvoie un tableau avec les résultats
		// (en cas d'erreur, on renvoie false)
		
		
		// d'abord, on parcoure le tableau des object_id et on les mets en forme
		// pour préparer la requete
		
		$queryArray = array();
		$i = 0;
		
		foreach ($arrayOfObjectId as $objectId) {
			
			$queryArray[$i++] = array('method' => 'GET', 'relative_url' => $objectId);
			
		}
			
		echo "<pre>".print_r($queryArray)."</pre>";
		
		
		$feedQueryUrl = "https://graph.facebook.com/?"
				. $this->accessToken
				. "&method=post"
				. "&batch=" . json_encode($queryArray);
		
		$feedQueryResult = file_get_contents($feedQueryUrl);
 		$feedQueryResultArray = json_decode($feedQueryResult, true);

 		// on controle si il n'y a pas d'erreur
 		if (isset($feedQueryResultArray[error])) {
 			
 			// il y a une erreur, on renvoie alors "false"
 			return false;
 		}
 		
		$returnResults = array(); $i = 0;
		
		// on parcoure les resultats donnés par l'API et les remets sous tableau PHP
		foreach ($feedQueryResultArray as $results)	{

			$returnResults[$i++] = json_decode($results['body']);
			
		}
		
		return $returnResults;

	}
	
	private function getUnixTimeDateFromToday($day, $month, $year) {
	
		// renvoie le code de temps Unix par apport à aujourd'hui
		// Exemple: si year = 0, month = -1 et day = 1, cela renvoie date d'un mois AVANT aujourd'hui
		// Si nous sommes le 13 septembre 2012, cela reverra le code temps Unix pour le 12 septembre
		// on peut donner des nombres positifs ou négatif (+2 mois, -3 jours, etc.)
	
		return mktime(0, 0, 0, date("m") + $month, date("d") + $day, date("Y") + $year);
		
		// NOTE: on peut indexer les requete du Graph API avec les attributs "since" et "until" (voir doc API Facebook)
	}
	
	public function sendAPISingleQuery($query) {
		
		// on envoie une requete FQL à l'API (voir doc Facebook Developers)
		// et on récupère un array associatif avec les résultats
		// On est ici dans une query simple (voir méthode sendAPIMultiQuery() pour 
		// les queries multiples pour de meilleurs performances)
		
		// EN CAS DE DEBUG : utiliser cette ligne:
		
		// 		 $fqlQueryUrl = 'https://graph.facebook.com/'
		// 				. '/fql?q=SELECT+uid2+FROM+friend+WHERE+uid1=me()'
		// 				. '&' . $this->accessToken;
		
		
		
		$fqlQueryUrl = 'https://graph.facebook.com/'
				. '/fql?q='.urlencode($query)
				. '&' . $this->accessToken;
		
		
		$fqlQueryResult = file_get_contents($fqlQueryUrl);
		
		return json_decode($fqlQueryResult, true);
		
	}
	
	
	public function sendAPIMultyQuery($arrayMultiQuery) {
		
		// en parametre, on donne un array assosiatif
		// exemple: $arrayMultiQuery = array("all friends" => "SELECT uid2 FROM friend WHERE uid1=me()",
		//                                   "my name" => "SELECT name FROM user WHERE uid=me()");
		
		// DEBUG: Essayer cette ligne:
		
		// 		$fqlMultiQueryUrl = 'https://graph.facebook.com/'
		// 				. 'fql?q={"all+friends":"SELECT+uid2+FROM+friend+WHERE+uid1=me()",'
		// 				. '"my+name":"SELECT+name+FROM+user+WHERE+uid=me()"}'
		// 						. '&' . $this->accessToken;
		
		
		// Composition de la requete multiple
		$fqlMultiQueryUrl = 'https://graph.facebook.com/fql?q={';
		
		foreach ($arrayMultiQuery as $key => $value) {
			
			// on boucle sur chaque élément de requete dans les tableau, et ajoute une virgule
			$fqlMultiQueryUrl .= '"'.urlencode($key).'":"'.urlencode($value).'",';
						
		}
		
		// on retire la dernière virgule
		$fqlMultiQueryUrl = substr($fqlMultiQueryUrl, 0, strlen($fqlMultiQueryUrl)-1);
		
		// on termine la requête
		$fqlMultiQueryUrl .= '}&'.$this->accessToken;
		
		$fqlMultiQueryResult = file_get_contents($fqlMultiQueryUrl);
		
		return json_decode($fqlMultiQueryResult, true);
	}
	
	
	public function displayAPIQuery($arrayQuery){
		
		echo "<pre>";
		print_r($arrayQuery);
		echo "</pre>";
		
	}
	
	
	///////  GETTERS/SETTERS
	
	private function getAccessToken() {
		
		// si le champ access token n'est rempli, on va le chercher
		if (empty($this->accessToken)) {
			
			// Pas d'access token (sans doute parce que l'on vient d'instancier
			// cette classe Facebook). On va donc demander à l'API de nous en fournir un
			// Comment? On appelle une URL et on récupère l'access token
				
			$tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id='
					. $this->appId . '&redirect_uri=' . urlencode($this->postAuthUrl)
					. '&client_secret=' . $this->appSecret
					. '&code=' . $this->codeAPI;
				
			$accessTokenTemp = file_get_contents($tokenUrl);
			$this->accessToken = file_get_contents($tokenUrl);
			
		}
		
		// maintenant qu'on est certain qu'il y a un access token,
		// on le renvoie.
		return $this->accessToken;
		
	}
}


?>